#ifndef _REG_TOKEN
#define _REG_TOKEN

#include <iostream>
#include "Buffer.h"

namespace dfa_lex {
	enum Reg_token {
		LEFT_BRACKET,	// <
		REV,			// ^
		RIG_BRACKET,	// >
		STR,			// "str"
		DOT,			// .
		LEFT_BRACE,		// [
		SET,			// set
		RIG_BRACE,		// ]
		LEFT_PAR,		// (
		RIG_PAR,		// )
		LEFT_BIG,		// {
		ID,				// identifier
		RIG_BIG,		// }
		KLEEN,			// *
		ONE_MORE,		// +
		ZERO_ONE,		// ?
		INT,			// integer
		COMMA,			// ,
		OR,				// |
		NOR_CHAR,		// normal character
		SUFFIX,			// /
		END_LINE,		// end line
		END,			// the input end
		UNDEF			// undefined character
	};
	class Token {
	public:
		Token(mylib::Buffer &in) : in_str(&in) { token_type = dfa_lex::UNDEF; in_times=false;}
		Token(const std::string &str, Reg_token t) {
			in_str = 0;
			lexeme = str;
			token_type = t;
			in_times=false;
		}
		~Token() {}

		class Err_input {};		// exception
		Reg_token get();
		size_t len()const {return lexeme.size();}	// the length of current token
		const std::string &token()const {return lexeme;}	// the the token string
		Reg_token type()const{return token_type;}	// the token's type
	private:
		Token(const Token &token) {}		// cannot be copied
	private :
		mylib::Buffer *in_str;	// the input stream
		std::string lexeme;
		Reg_token token_type;
		bool in_times;			// use for distingish 'int' and 'normal character'
	};
}
#endif
